'''
Description: 
Author: Zilu
Date: 2021-11-11 11:45:16
Version: 
LastEditTime: 2021-11-12 12:11:04
LastEditors: Zilu
'''

# 使用 namedtuple 创建有名称的 tuple，并且可以用属性引用tuple的值
from collections import namedtuple
Point = namedtuple('Point',['x','y'])
p = Point(1,2)
p.x
p.y
type(p)
isinstance(p, tuple)
isinstance(p, Point)

# deque: 双向列表
from collections import deque
q = deque(['a','b','c'])
q.append('x')
q.appendleft('y')
q

# defaultdict 可以在key值不存在时返回一个默认值
from collections import defaultdict
dd = defaultdict(lambda:'N/A')
dd['key1'] = 'abc'
dd['key1']
dd['key2']

# dict本身对键值的的排序是无序的，而OredredDict按照插入的顺序排序
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
d
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od
print(od)
od.popitem(last=True)

# OrderedDict可以实现一个FIFO（先进先出）的dict，当容量超出限制时，先删除最早添加的Key
class LastUpdatedOrderedDict(OrderedDict):
    def __init__(self, list, capacity):
        super(OrderedDict, self).__init__(list)
        self._capacity = capacity

    def __setitem__(self, key, value):
        # __setitem__ 存在即覆盖，不存在即添加
        contains = 1 if key in self else 0
        if len(self) - contains >= self._capacity:
            last = self.popitem(last=False)
            print('remove:', last)
        if contains:
            del self[key]
            print('set:', (key, value))
        else:
            print('add:', (key, value))
        OrderedDict.__setitem__(self, key, value)
        
    def __repr__(self) -> str:
        return super().__repr__()

lod = LastUpdatedOrderedDict([('a', 1), ('b', 2), ('c', 3)], 3)
lod

# ChainMap可以把一组dict串起来并组成一个逻辑上的dict。
# ChainMap本身也是一个dict，但是查找的时候，会按照顺序在内部的dict依次查找。
from collections import ChainMap
import os, argparse

# 构造缺省参数
defalts = {
    'color': 'red',
    'user': 'guest'
}

# 构造命令行参数
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c','--color')
namespace = parser.parse_args()
comman_line_args = {k:v for k,v in vars(namespace).items() if v}

# 组合成 ChainMap
combined = ChainMap(comman_line_args, os.environ, defalts)
print('color = %s' % combined['color'])
print('user = %s' % combined['user'])

# 使用Counter计数器，Counter 实际上是dict的一个子类
from collections import Counter
c = Counter()
for ch in 'programming':
    c[ch] = c[ch] + 1

c
c.update('hello')
c





